<?php


class Date{
    
	
    private static $nom_jour_fr = array('dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi');
    private static $mois_fr = Array('', 'janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 
	    'septembre', 'octobre', 'novembre', 'décembre');

    
    
    
    public static function ajouterJours($date, $nbJours){
        return mktime(date('H',$date),
                      date('i',$date),
                      date('s',$date),
                      date('m',$date),
                      date('d',$date)+$nbJours,
                      date('Y',$date));
    }
	
	
    //détermine si une chaine correspond au pattern de date 'Y-m-d'
    public static function isDate($string){
        $tempDate = DateTime::createFromFormat('Y-m-d', $string);
        return $tempDate && $tempDate->format('Y-m-d') == $string;
    }
    
    
    /**
     * Retourne vrai si cette date est aujourd'hui
     **/
    public static function isToday($date){
        $today=mktime(0, 0, 0, date('n'), date('d'), date('Y'));
        return $date==$today;
    }
    
    
    /**
     * Retourne vrai si la date fait partie de la liste
     **/
    public static function isDateInList($date,$liste){
        foreach($liste as $dateListe){
            $timeListe=DateTime::createFromFormat('Y-m-d', $dateListe);
            $timeListe=$timeListe->getTimestamp();
            $ferie=mktime(0, 0, 0, date('n',$timeListe), date('d',$timeListe), date('Y',$timeListe));
            if($date==$ferie){
                return true;
            }
        }
        return false;
    }
    
    
    //retourne la date actuelle au format SQL
    public static function nowSQL(){
        return date('Y-m-d');
    }
    
    
    //retourne l'ensemble des jours déclarés clos pendant une période
    public static function getJoursClos($periode){
        return JourClos::getAllInPeriode($periode);
    }
	
	
    //obtenir le nom d'un jour à partir de son index
    public static function formaterJourFR($number){
        return self::$nom_jour_fr[$number];
    }
	
	
	
    //converti une date string (sql ou html) en date lisible
    public static function stringToDateFR($string, $showAnnee=true, $showJourSemaine=true, $showFullMois=true, $showFullJour=true){
        $tempDate = DateTime::createFromFormat('Y-m-d', $string);
        return Date::timestampToDateFR($tempDate->getTimestamp(),$showAnneetrue, $showJourSemaine, $showFullMois, $showFullJour);
    }
	
	
	
    //converti un timestamp (nb secondes depuis 1970) en date lisible
    public static function timestampToDateFR($int, $showAnnee=true, $showJourSemaine=true, $showFullMois=true, $showFullJour=true){
        list($nom_jour, $jour, $mois, $annee) = explode('/', date('w/d/n/Y',$int));
        $retour='';
        if($showJourSemaine){
            if($showFullJour) $retour=self::$nom_jour_fr[$nom_jour];
            else $retour=substr(self::$nom_jour_fr[$nom_jour],0,3);
            $retour.=' ';
        }
        $retour.=$jour.' ';
        if($showFullMois) $retour.=self::$mois_fr[$mois];
        else $retour.=substr(self::$mois_fr[$mois],0,5);
        if($showAnnee) $retour.=' '.$annee;
        return $retour; 
    }
	
	
    //converti un timestamp (nb secondes depuis 1970) date texte selon un pattern
    //le pattern par défaut correspond à celui en base et manipulé par l'input html
    public static function timestampToPattern($int, $pattern='Y-m-d'){
        return date($pattern, $int);
    }
	
	
    //convertir une chaine en date lisible
    //le pattern par défaut correspond à celui en base et manipulé par l'input html
    public static function formaterDateFR($string, $pattern='Y-m-d'){
        $tempDate = DateTime::createFromFormat($pattern, $string);
        return Date::timestampToDateFR($tempDate->getTimestamp());
    }
	
	
    public static function formaterDate($string, $pattern='d/m/y'){
        $tempDate = DateTime::createFromFormat('Y-m-d', $string);
        if(!$tempDate) return '';
        return date($pattern,$tempDate->getTimestamp());
    }
	
    
    //converti la valeur du champ html input[type='time'] en nombre de minutes
    //le format en base est le nombre de minutes
    public static function timeToMinutes($string){
        $minutes=0;
        $params=explode(':',$string);
        if(count($params)==2){
            $minutes=60*$params[0]+$params[1];
        }
        return $minutes;
    }
    
    
    //converti un nombre de minutes en format supporté par le champ html input[type='time']
    public static function formaterTime($number){
        $hours=floor($number/60)%24;
        if($hours<10) $hours='0'.$hours;
        $minutes=$number%60;
        if($minutes<10) $minutes='0'.$minutes;
        return $hours.':'.$minutes;
    }
    
    
    //converti un nombre de minutes en durée lisible
    public static function formaterDuree($number){
        $hours=floor($number/60)%24;
        $minutes=$number%60;
        if($minutes<10) $minutes='0'.$minutes;
        return $hours.'h'.$minutes;
    }
    
    
    /**
     * Retourne le timestamp de la date correspondant au premier jour de la semaine.
     **/
    public static function getPremierJourSemaine($annee, $noSemaine){
        $simpleWeek=mktime(0,0,0,1,1+(($noSemaine-1)*7),$annee);
        $dayOfWeek = date('w',$simpleWeek);
        if ($dayOfWeek <= 4){
            $isoWeek=mktime(0, 0, 0, date('n',$simpleWeek), date('d',$simpleWeek)-$dayOfWeek+1, $annee);
        }
        else{
            $isoWeek=mktime(0, 0, 0, date('n',$simpleWeek), date('d',$simpleWeek)-$dayOfWeek+8, $annee);
        }
        return $isoWeek;
    }
    
    
    /**
     * Retourne les timestamp des dates de début et de fin de la semaine.
     **/
    public static function getSemaine($annee=0, $noSemaine=0){
        //si on a pas récupéré de semaine correcte
        if($annee==0 || $noSemaine==0){
            //on prend la semaine actuelle
            $annee=date('Y');
            $noSemaine=date('W');
        }
        $debut=self::getPremierJourSemaine($annee,$noSemaine);
        $fin=mktime(0, 0, 0, date('n',$debut), date('d',$debut)+7, date('Y',$debut));
        return array(
            'debut'=>$debut,
            'fin'=>$fin
        );
    }
    
    


    
}


?>